package br.eng.eliseu.gwt.gestaoWeb.model.endereco;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;

import br.eng.eliseu.gwt.gestaoWeb.client.util.StringUtil;
import br.eng.eliseu.gwt.gestaoWeb.model.BaseEntity;

@Entity
@SequenceGenerator(name="SQ_ENDERECO", sequenceName="SQ_ENDERECO")
@NamedQueries({
	@NamedQuery(name="endereco.porCidade", query="select b from Endereco b where b.cidade = :cidade order by b.logradouro"),
	@NamedQuery(name="endereco.porCidadeLogradouroNumero", query="select b from Endereco b "+
			"where b.cidade = :cidade "+
			"and upper(b.logradouro) like upper(:logradouro) "+
			"and upper(b.numero) = upper(:numero) "+
			"order by b.logradouro")
})
public class Endereco extends BaseEntity {

	
	public Endereco(){}
	
	@Id
	@GeneratedValue(generator="SQ_ENDERECO", strategy=GenerationType.AUTO)
	private Integer id;

//	@Enumerated(EnumType.STRING)
//	private TipoEnderecoEnum tipo;
//	
//	private Boolean principal;
	
	@ManyToOne
	@JoinColumn(name="tipoLogradouro_id")
	private TipoLogradouro tipoLogradouro;
	
	@Column(length=254)
	private String logradouro;
	
	@Column(length=50)
	private String numero;
	
	@Column(length=50)
	private String complemento;
	
	@Column(length=50)
	private String bairro;
	
	@ManyToOne
	@JoinColumn(name="cidade_id")
	private Cidade cidade;
	
	@ManyToOne
	@JoinColumn(name="estado_id")
	private Estado estado;
	
	@ManyToOne
	@JoinColumn(name="pais_id")
	private Pais pais;
	
	@Column(length=8)
	private String cep;

	
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
//	public TipoEnderecoEnum getTipo() {
//		return tipo;
//	}
//	public void setTipo(TipoEnderecoEnum tipo) {
//		this.tipo = tipo;
//	}
	public TipoLogradouro getTipoLogradouro() {
		return tipoLogradouro;
	}
	public void setTipoLogradouro(TipoLogradouro tipoLogradouro) {
		this.tipoLogradouro = tipoLogradouro;
	}
	public String getLogradouro() {
		return logradouro;
	}
	public String getLogradouroX() {
		StringBuffer b = new StringBuffer();
		b.append(tipoLogradouro+" ");
		b.append(logradouro);
		if (numero!=null || !"".equals(numero)){
			b.append(", "+numero);
		}
		if (complemento!=null || !"".equals(complemento)){
			b.append(" ("+complemento+")");
		}
			
		return b.toString();
	}
	public void setLogradouro(String logradouro) {
		if (logradouro!=null){
			logradouro = StringUtil.padronizaNome(logradouro);
		}
		this.logradouro = logradouro;
	}
//	public Boolean getPrincipal() {
//		return principal;
//	}
//	public void setPrincipal(Boolean principal) {
//		this.principal = principal;
//	}
	
	@Override
	public String toString() {
		StringBuffer enderecoStr = new StringBuffer();
//		if(principal!=null && principal){
//			enderecoStr.append("* ");
//		}
		if(getLogradouro()!=null){
			enderecoStr.append(getLogradouro());
		}
		if(getNumero()!=null){
			enderecoStr.append(", " + getNumero());
		}
		if(getComplemento()!=null){
			enderecoStr.append(" " + getComplemento());
		}
		if(getCidade()!=null){
			enderecoStr.append(" - " + getCidade().getNome());
		}
		if(getEstado()!=null){
			enderecoStr.append("/" + getEstado());
		}
		return enderecoStr.toString();
	}
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		if (numero!=null && !"".equals(numero)){
			numero = StringUtil.padronizaNome(numero);
		}
		this.numero = numero;
	}
	public String getComplemento() {
		return complemento;
	}
	public void setComplemento(String complemento) {
		if (complemento!=null && !"".equals(complemento)){
			complemento = StringUtil.padronizaNome(complemento);
		}
		this.complemento = complemento;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		if (bairro!=null){
			bairro = StringUtil.padronizaNome(bairro);
		}
		this.bairro = bairro;
	}
	public Cidade getCidade() {
		return cidade;
	}
	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}
	public Estado getEstado() {
		return estado;
	}
	public void setEstado(Estado estado) {
		this.estado = estado;
	}
	public Pais getPais() {
		return pais;
	}
	public void setPais(Pais pais) {
		this.pais = pais;
	}
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		if (cep!=null && !"".equals(cep)){
			cep = cep.replaceAll("[^0-9]", "");
		}
		this.cep = cep;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((getBairro() == null) ? 0 : getBairro().hashCode());
		result = prime * result + ((cep == null) ? 0 : cep.hashCode());
		result = prime * result + ((cidade == null) ? 0 : cidade.hashCode());
		result = prime * result
				+ ((complemento == null) ? 0 : complemento.hashCode());
		result = prime * result + ((estado == null) ? 0 : estado.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result
				+ ((getLogradouro() == null) ? 0 : getLogradouro().hashCode());
		result = prime * result + ((numero == null) ? 0 : numero.hashCode());
//		result = prime * result
//				+ ((principal == null) ? 0 : principal.hashCode());
//		result = prime * result + ((tipo == null) ? 0 : tipo.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Endereco other = (Endereco) obj;
		if (getBairro() == null) {
			if (other.getBairro() != null)
				return false;
		} else if (!getBairro().equals(other.getBairro()))
			return false;
		if (cep == null) {
			if (other.cep != null)
				return false;
		} else if (!cep.equals(other.cep))
			return false;
		if (cidade == null) {
			if (other.cidade != null)
				return false;
		} else if (!cidade.equals(other.cidade))
			return false;
		if (complemento == null) {
			if (other.complemento != null)
				return false;
		} else if (!complemento.equals(other.complemento))
			return false;
		if (estado == null) {
			if (other.estado != null)
				return false;
		} else if (!estado.equals(other.estado))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (getLogradouro() == null) {
			if (other.getLogradouro() != null)
				return false;
		} else if (!getLogradouro().equals(other.getLogradouro()))
			return false;
		if (numero == null) {
			if (other.numero != null)
				return false;
		} else if (!numero.equals(other.numero))
			return false;
//		if (principal == null) {
//			if (other.principal != null)
//				return false;
//		} else if (!principal.equals(other.principal))
//			return false;
//		if (tipo != other.tipo)
//			return false;
		return true;
	}
}